package com.um.springboot.starter.orm.entity;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.um.springboot.starter.code.CommonCode;
import com.um.springboot.starter.utils.EnumUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * 通用返回对象
 * Created by macro on 2019/4/19.
 */
@Data
public class Response<T> implements Serializable {

    @ApiModelProperty(value = "错误码", example = "0")
    private Integer code;
    @ApiModelProperty(value = "描述", example = "操作成功!")
    private String msg;
    @ApiModelProperty(value = "返回数据")
    private T data;

    protected Response() {
    }

    protected Response(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功返回结果
     */
    public static <T> Response<T> success() {
        return success(null);
    }

    /**
     * 成功返回结果
     *
     * @param data 获取的数据
     */
    public static <T> Response<T> success(T data) {
        return success(CommonCode.Success, data);
    }

    /**
     * 成功返回结果
     * @param errorCode 错误码
     * @param data 获取的数据
     */
    public static <T, E extends EnumUtil.ErrorEnum> Response<T> success(E errorCode, T data) {
        return new Response<>(errorCode.getCode(), errorCode.getMsg(), data);
    }

    /**
     * 失败返回结果
     * @param errorCode 错误码
     */
    public static <T, E extends EnumUtil.ErrorEnum> Response<T> failed(E errorCode) {
        return new Response<>(errorCode.getCode(), errorCode.getMsg(), null);
    }

    /**
     * 失败返回结果
     * @param errorCode 错误码
     * @param msg 提示信息
     */
    public static <T, E extends EnumUtil.ErrorEnum> Response<T> failed(E errorCode, String msg) {
        return new Response<>(errorCode.getCode(), msg, null);
    }

    /**
     * 失败返回结果
     */
    public static <T> Response<T> failed() {
        return failed(CommonCode.Failed);
    }

    /**
     * 失败返回结果
     * @param msg 提示信息
     */
    public static <T> Response<T> failed(String msg) {
        return failed(CommonCode.Failed.getCode(), msg);
    }

    /**
     * 失败返回结果
     * @param code 错误码
     * @param msg 提示信息
     */
    public static <T> Response<T> failed(Integer code, String msg) {
        return new Response<>(code, msg, null);
    }

    /**
     * 失败返回结果
     * @param code 错误码
     * @param msg 提示信息
     * @param data 获取的数据
     */
    public static <T> Response<T> failed(Integer code, String msg, T data) {
        return new Response<>(code, msg, data);
    }

}
